// 发布与订阅模式
class EventEmitter {
    constructor() {
        // 设置对象为null没有原型属性，提升性能
        this.subs = Object.create(null)
    }

    // 注册事件
    $on(eventType, handler) {
        // 判断是否有该事件类型
        this.subs[eventType] = this.subs[eventType] || []
        this.subs[eventType].push(handler)
    }

    // 触发事件
    $emit(eventType) {
        if (this.subs[eventType]) {
            this.subs[eventType].forEach(handler => {
                handler()
            })
        }
    }
}

// 观察者模式
// 发布者
class Dep {
    constructor() {
        // 记录所有订阅者
        this.subs = []
    }

    addSub(sub) {
        // 有sub并且update这个方法
        if (sub && sub.update) {
            this.subs.push(sub)
        }
    }

    notify() {
        this.subs.forEach(sub => {
            sub.update()
        })
    }
}

// 订阅者-观察者
class Watcher {
    update() {
        console.log('update')
    }
}

let dep = new Dep()
let watcher = new Watcher()
